
        <html>
			<head>
			     <title>DVWA中学习PHP常见漏洞及修复方法 - erevus</title>
				 <meta http-equiv="content-type" content="text/html; charset=UTF-8">
			</head>
			<body>
				<h1>原文地址:<a href="http://drops.wooyun.org/papers/483">http://drops.wooyun.org/papers/483</a></h1>
				
      <p>
        <p>“安全是一个整体，保证安全不在于强大的地方有多强大 而在于真正薄弱的地方在哪里”--剑心</p>

<p>从很多的渗透大型企业内网的案例来看，入侵者大多数是从Web上找到漏洞，从而利用漏洞进一步进行提权，渗透入侵。</p>

<p> <a target="_blank" href="http://www.wooyun.org/bugs/wooyun-2013-022743">WooYun: 时代互联上传漏洞多台数据库可控</a> </p>

<p> <a target="_blank" href="http://www.wooyun.org/bugs/wooyun-2012-09627">WooYun: 网易某系统未授权访问可导致内网被渗透</a> </p>

<p> <a target="_blank" href="http://www.wooyun.org/bugs/wooyun-2012-09671">WooYun: 网易某系统未授权访问续—内网渗透</a> </p>

<p> <a target="_blank" href="http://www.wooyun.org/bugs/wooyun-2013-026850">WooYun: 搜弧某分站XFF注射&amp;配置不当导致源码泄漏等重大漏洞</a> </p>

<p><a href="http://www.wooyun.org/whitehats/%E6%A2%A7%E6%A1%90%E9%9B%A8/page/3">梧桐雨的大型互联网系列</a></p>

<!--more-->

<p>脚本安全就像你家的防盗门，你家门都没关，你家能安全吗？</p>

<p>乌云上最常见的脚本漏洞莫过于SQL注入和XSS。</p>

<p>脚本安全的本质就是脚本接受了不安全的变量输入，又没得到有效的过滤，最后进入一些对敏感的函数就会对安全造成威胁。</p>

<p>比如出现在mysql&#95;query()函数可能就会造成SQL注入漏洞，出现在eval()以及preg&#95;replace()中可能导致代码的执行。</p>

<p>这里我用DVWA演示SQL,XSS ,任意代码执行漏洞的原理</p>

<p>然后用各种修复方法进行修复，附带讲解一些修复方法的弊端。</p>

<p>DVWA下载地址: https://github.com/RandomStorm/DVWA/archive/v1.0.8.zip</p>

<p>DVWA sql调用的文件/vulnerabilities/sqli/目录下，分为low,medium,high三个等级</p>

<h3>SQL注入原理</h3>

<pre><code>#!php
//Low.php

if(isset($_GET['Submit'])){

    // Retrieve data

    $id = $_GET['id'];

    $getid = "SELECT first_name, last_name FROM users WHERE user_id = '$id'";//这里$id变量没有经过任何的过滤，直接传入了sql语句，造成字符型注入
    $result = mysql_query($getid) or die('&lt;pre&gt;' . mysql_error() . '&lt;/pre&gt;' );//执行SQL
</code></pre>

<p>原SQL中</p>

<pre><code>SELECT first_name, last_name FROM users WHERE user_id = '$id'
</code></pre>

<p>中的$id可被用户控制，当黑客把$id变成</p>

<pre><code>' union select user,password from users#
</code></pre>

<p>那么这条语句就会变成</p>

<pre><code>SELECT first_name, last_name FROM users WHERE user_id = '' union select user,password from users#
</code></pre>

<p>这样导致了数据库中其他数据被黑客查询。 ￼</p>

<p><img src="http://static.wooyun.org/20140918/2014091811393657444.png" alt="enter image description here" /></p>

<pre><code>#!php
//medium.php中
if (isset($_GET['Submit'])) {

    // Retrieve data

    $id = $_GET['id'];
    $id = mysql_real_escape_string($id);

    $getid = "SELECT first_name, last_name FROM users WHERE user_id = $id";

    $result = mysql_query($getid) or die('&lt;pre&gt;' . mysql_error() . '&lt;/pre&gt;' );

    $num = mysql_numrows($result);
</code></pre>

<p>虽然$id经过了mysql&#95;real&#95;escape_string转义了’，可是因为后面的SQL语句$id没有单引号保护，会被系统认为是数值型，导致数值型注入</p>

<p>构造SQL注入语句</p>

<pre><code>1 union select user,password from users
</code></pre>

<p>SQL语句就变成了</p>

<pre><code>SELECT first_name, last_name FROM users WHERE user_id = 1 union select user,password from users ￼
</code></pre>

<p><img src="http://static.wooyun.org/20140918/2014091811393715050.png" alt="enter image description here" /></p>

<h3>SQL注入修补方法</h3>

<p>字符型注入漏洞修补方法：</p>

<p>PHP5.3之前版本在php.ini中设置</p>

<pre><code>magic_quotes_gpc=On; 
</code></pre>

<p>magic&#95;quotes&#95;quotes&#95;gpc会对传入的$&#95;POST,$&#95;GET,$&#95;SERVER里的 ‘,”,\进行转义。</p>

<p>但是PHP5.4之后，magic&#95;quotes&#95;quotes_gpc就被废除了。</p>

<p>还要使用mysql&#95;real&#95;escape&#95;string()或addslashes()对传入参数进行过滤，或者使用str&#95;replace()对一些关键词进行替换。</p>

<p>例：</p>

<pre><code>#!php
if(isset($_GET['Submit'])){

// Retrieve data

$id = addslashes($_GET['id']);

$getid = "SELECT first_name, last_name FROM users WHERE user_id = '$id'";
$result = mysql_query($getid) or die('&lt;pre&gt;' . mysql_error() . '&lt;/pre&gt;' );

$num = mysql_numrows($result);
</code></pre>

<h3>修补后进行SQL注入</h3>

<p><img src="http://static.wooyun.org/20140918/2014091811393872893.png" alt="enter image description here" /></p>

<p>但是addslashes()和mysql&#95;real&#95;escape_string()在数据库字符集设为GBK时是可能被绕过的。</p>

<p>PHP字符编码绕过漏洞参考文<a href="http://huaidan.org/archives/2268.html">http://huaidan.org/archives/2268.html</a></p>

<p>如果数据库字符集是GBK的情况下，可以把</p>

<pre><code>$mysqli-&gt;query('SET NAMES gbk'); 
</code></pre>

<p>修改为：</p>

<pre><code>$mysqli-&gt;set_charset('gbk');
</code></pre>

<p>数值型注入：</p>

<p>数值型注入比较好修补，只需要判断传入的变量是否为数值型就可以了(或者强行改成字符型)</p>

<p>例：</p>

<pre><code>#!php
$id = $_GET['id'];
$id = intval ($id);

$getid = "SELECT first_name, last_name FROM users WHERE user_id = $id";

$result = mysql_query($getid) or die('&lt;pre&gt;' . mysql_error() . '&lt;/pre&gt;' );

$num = mysql_numrows($result);
</code></pre>

<p>修补后效果</p>

<p><img src="http://static.wooyun.org/20140918/2014091811393913065.png" alt="enter image description here" /></p>

<h3>XSS漏洞原理</h3>

<p>黑客往Web页面里插入恶意html代码，当用户浏览该页之时，嵌入其中Web里面的html代码会被执行，从而达到黑客的特殊目的，比如窃取用户cookies.或者进行其他操作。 在</p>

<pre><code>#!php
//low.php
&lt;?php
if(isset($_POST['btnSign']))
{

   $message = trim($_POST['mtxMessage']);
   $name    = trim($_POST['txtName']);

   // Sanitize message input
   $message = stripslashes($message);//stripslashes() 函数删除由 addslashes() 函数添加的反斜杠。
   $message = mysql_real_escape_string($message);//mysql_real_escape_string() 函数转义 SQL 语句中使用的字符串中的特殊字符。

   // Sanitize name input
   $name = mysql_real_escape_string($name);

   $query = "INSERT INTO guestbook (comment,name) VALUES ('$message','$name');";

   $result = mysql_query($query) or die('&lt;pre&gt;' . mysql_error() . '&lt;/pre&gt;' ); } 
?&gt; 
</code></pre>

<p>从上面程序可以看出，$message,$name两个变量从$_POST传入,只是经过一些特殊字符的转换。并没有对尖括号进行转义,所以还是造成了XSS的产生。</p>

<p>直接插入XSS语句</p>

<pre><code>&lt;script&gt;alert(1)&lt;script&gt;
</code></pre>

<p>就执行了</p>

<p>而medium.php中，虽然对$message进行了尖括号转义，而且对<code>&lt;script&gt;</code>进行了替换，但是$name没有进行转义，而且跨站脚本可以用多种标签，如<code>&lt;img /&gt;</code>,等…。Name的<code>&lt;input /&gt;</code>限制了maxlength=‘10’的长度，但是我们的防御对象是精通技术的黑客。这种html下的长度限制是可以直接通过浏览器修改..然后通过大小写成功绕过str_replace()，插入XSS.</p>

<p></p>

<p></p></p></p>

<pre><code>&lt;SCript&gt;alert(1)&lt;/SCript&gt;
</code></pre>

<p>￼ </br></p>

<p><img src="http://static.wooyun.org/20140918/2014091811393951601.jpeg" alt="enter image description here" /></p>

<pre><code>#!php
&lt;?php

if(isset($_POST['btnSign']))
{

   $message = trim($_POST['mtxMessage']);
   $name    = trim($_POST['txtName']);

   // Sanitize message input
   $message = trim(strip_tags(addslashes($message)));
   $message = mysql_real_escape_string($message);
   $message = htmlspecialchars($message);

   // Sanitize name input
   $name = str_replace('&lt;script&gt;', '', $name);  //一个大小写就可以绕过，或者&lt;img /&gt;
   $name = mysql_real_escape_string($name);

   $query = "INSERT INTO guestbook (comment,name) VALUES ('$message','$name');";

   $result = mysql_query($query) or die('&lt;pre&gt;' . mysql_error() . '&lt;/pre&gt;' );

}

?&gt;
</code></pre>

<h3>XSS漏洞修补方法</h3>

<p>使用htmlspecialchars()在输出时对输出内容就行转义。</p>

<p>瞌睡龙说：在输出时进行转义比输入时进行转义效果更好，因为可以确保数据在入库时是完整的….不然丢失数据。</p>

<p>例：</p>

<pre><code>#!php
&lt;?php

if(isset($_POST['btnSign']))
{

   $message = trim($_POST['mtxMessage']);
   $name    = trim($_POST['txtName']);

   // Sanitize message input
   $message = stripslashes($message);
   $message = mysql_real_escape_string($message);
   $message = htmlspecialchars($message);

   // Sanitize name input
   $name = stripslashes($name);
   $name = mysql_real_escape_string($name); 
   $name = htmlspecialchars($name);

   $query = "INSERT INTO guestbook (comment,name) VALUES ('$message','$name');";

   $result = mysql_query($query) or die('&lt;pre&gt;' . mysql_error() . '&lt;/pre&gt;' );

}

?&gt;
</code></pre>

<p>修补后效果，可以看到尖括号已经被转义了，html代码已经不执行</p>

<p><img src="http://static.wooyun.org/20140918/2014091811394037672.jpeg" alt="enter image description here" /></p>

<h3>任意命令执行漏洞原理</h3>

<p>任意命令执行可谓是web里最高危的漏洞了，有可能可以直接写下shell或者直接添加用户。</p>

<p>任意命令执行漏洞的产生大多是因为变量可以被用户输入控制，而没有经过任何的判断和过滤处理就进入了高危的函数。</p>

<pre><code>#!php
&lt;?php

if( isset( $_POST[ 'submit' ] ) ) {

    $target = $_REQUEST[ 'ip' ];

    // Determine OS and execute the ping command.
    if (stristr(php_uname('s'), 'Windows NT')) { 

        $cmd = shell_exec( 'ping  ' . $target );
        $html .= '&lt;pre&gt;'.$cmd.'&lt;/pre&gt;';

    } else { 

        $cmd = shell_exec( 'ping  -c 3 ' . $target );
        $html .= '

  &lt;pre&gt;'.$cmd.'&lt;/pre&gt;';

    }

}
?&gt;
</code></pre>

<p>由于$target没有经过处理就进入shell_exec函数，导致黑客可以构造特殊的变量执行批处理命令。</p>

<p>我输入可 0 | dir</p>

<p>那么执行的命令的命令就是 ping -c 0 | dir</p>

<p><img src="http://static.wooyun.org/20140918/2014091811394044689.jpeg" alt="enter image description here" /></p>

<p>假如黑客在利用时输入的是</p>

<pre><code>0|net user hacker/add
</code></pre>

<p>那么造成的后果将不堪设想</p>

<p>以下是可能会造成任意命令执行的函数</p>

<pre><code>system|passthru|exec|popen|proc_open|move_uploaded_file|eval|copy|shell_exec|assert
</code></pre>

<h3>任意命令执行漏洞修补办法</h3>

<p>在写程序时尽量地使变量不能被用户所控制！且注意变量初始化的问题。</p>

<p>使用str_replace对“%”，”|”,“>”进行替换</p>

<p>进入函数前判断变量是否合法。</p>

<h3>暴力破解漏洞</h3>

<p>这个是漏洞？算是吧…</p>

<p>祭上神器Burp Suite，Burp suite运行后，Burp suite,Proxy 开起默认的8080 端口作为本地代理接口。</p>

<p>使用Burp suite通过置一个web 浏览器使用其代理服务器，见下图 ￼ <img src="http://static.wooyun.org/20140918/2014091811394131639.jpeg" alt="enter image description here" /></p>

<p>然后打开你要暴力破解的后台，随便输入一个账号密码…把抓到的包send to intruder ￼ ￼<img src="http://static.wooyun.org/20140918/2014091811394151830.png" alt="enter image description here" /></p>

<p><img src="http://static.wooyun.org/20140918/2014091811394266140.jpeg" alt="enter image description here" /></p>

<p><img src="http://static.wooyun.org/20140918/2014091811394215497.jpeg" alt="enter image description here" /></p>

<p>Start attack~~~</p>

<p>然后就对面返回包的大小，知道密码</p>

<p><img src="http://static.wooyun.org/20140918/2014091811394271364.jpeg" alt="enter image description here" /></p>

<h3>暴力破解漏洞修补方法</h3>

<p>加个google验证码，保证没有程序能识别出来…</p>

<h3>文件包含漏洞</h3>

<p>文件包含漏洞分为两种，一种是远程包含，一种是本地包含。</p>

<p>服务器通过php的特性（函数）去包含任意文件时，由于要包含的这个文件来源过滤不严，从而可去调用并执行一个文(木)件(马)，而我们可以构造这个文(木)件(马)来达到邪恶的目的。</p>

<p>涉及到的危险函数，include(),require()和include&#95;once(),require&#95;once()</p>

<p>现在远程包含的漏洞已经不多了，但是远程包含的危害是最大，相当于一个命令执行。</p>

<p>而本地包含，有时配合一下解析漏洞往往可以getshell.</p>

<p>例：</p>

<pre><code>#!php
&lt;?php 

    $file = $_GET['page']; //The page we wish to display  

?&gt;
</code></pre>

<p>Include.php内容：</p>

<pre><code>#!php
&lt;?php 
echo "hello world\n";
?&gt;
</code></pre>

<h3>总结</h3>

<p>在编写程序时，应有良好的代码习惯，如使用变量前初始化。</p>

<p>做安全的过滤在全局里做，或者写在类里。</p>

<p>不要相信数据，所有输入在得到证明之前都是不可信的，所有从用户上输入的数据都应该加以判断。</p>

<p>不返回过多错误的原因，如一个黑客进行sql注入。</p>

<p>多上wooyun看漏洞</p>

<p></p>

<p></p>

<p></p></p>      </p>
    
			</body>
		</html>
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          